package com.gm.commonlib.filters;

import android.text.InputFilter;
import android.text.Spanned;

import java.util.regex.Pattern;


public class RegexResultFilter implements InputFilter {

    final protected Pattern enterPattern;

    /**
     * @param regex 内容正则表达式
     * 如果内容和正则表达式匹配，如果是想匹配留下的内容，则显示到输入框，否则不显示到输入框
     * 如果内容和正则表达式不匹配，正好与上面相反
     */
    public RegexResultFilter(String regex) {
        enterPattern = Pattern.compile(regex);
    }

    /**
     * @param source 输入的文字
     * @param start 输入-0，删除-0
     * @param end 输入-文字的长度，删除-0
     * @param dest 原先显示的内容
     * @param dstart 输入-原光标位置，删除-光标删除结束位置
     * @param dend  输入-原光标位置，删除-光标删除开始位置
     * @return TODO 不论是什么，只对输入有效果，对删除无效果
     *  TODO "":    放弃本次输入，即本次输入不会添加到输入框中
     *  TODO null:  将本次输入完全完全添加到输入框中,相当于return source(不建议使用return source)
     */
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        if(enterPattern != null) {
            StringBuilder stringBuilder = new StringBuilder();
            if(end > 0) {
                //TODO 输入 - 开始部分
                stringBuilder.append(dest.subSequence(0, dstart));
                //TODO 输入 - 键盘输入
                stringBuilder.append(source);
                //TODO 输入 - 结束部分
                stringBuilder.append(dest.subSequence(dstart, dest.length()));
            } else {
                //TODO 删除 - 开始部分
                stringBuilder.append(dest.subSequence(0, dstart));
                //TODO 删除 - 结束部分
                stringBuilder.append(dest.subSequence(dend, dest.length()));
            }

            final String result = stringBuilder.toString();
            System.out.println("预计结果: " + stringBuilder.toString());

            //TODO 如果正则满足,返回输入内容
            //TODO 如果不满足正则但是接受内容,返回输入内容
            if (match(source, start, end, result)
                    || accept(source, start, end, dest, dstart, dend,  result)) {
                return source;
            } else {
                return "";
            }
        } else {
            return source;
        }
    }

    //TODO 匹配正则
    protected boolean match(CharSequence source, int start, int end, String result) {
        return enterPattern.matcher(result).matches();
    }

    //TODO 默认不接受不满足正则表达式的内容
    protected boolean accept(CharSequence source, int start, int end, Spanned dest, int dstart, int dend, String result) {
        return false;
    }
}
